//
// Created by Administrator on 2024/3/26.
// https://oj.youdao.com/problem/19388?from=problems/
// https://www.luogu.com.cn/record/172114869
// PASS
// 按照视频讲解的方法 结合埃氏筛法
// 2024.3 GESP 五级编程题  位置:22:19
// 【GESP五级上机真题讲解23年9月-24年月3月】 https://www.bilibili.com/video/BV13jg6eDEDc/?share_source=copy_web&vd_source=039990b6433b5af9bd2905234cc47ac6
/*
B-smooth 数

【问题描述】
小杨同学想寻找一种名为 B-smooth 数的正整数。
如果一个正整数的最大质因子不超过B ，则该正整数为B-smooth 数。
小杨同学想知道，对于给定的 n和B ，有多少个不超过n的B-smooth 数。
【输入描述】
第一行包含两个正整数n，B ，含义如题面所示。
【输出描述】
输出一个非负整数，表示不超过n的B-smooth 数的数量。
【样例输入 1】
10 3
【样例输出 1】
7
 input
 373 46
 output
 246
 input
 1603 100001
 output
 1603
【样例解释】
在不超过10的正整数中，3-smooth数有{1, 2, 3, 4, 6, 8, 9}，共7个。
【数据范围】
编号 数据点占比	n	        B
1	30	    n<=1000	    1 <= B <= 1000
2	30	    n<= 10^6    n^(1/2) <= B <= 10^6
3	40	    n<= 10^6    1 <= B <= 10^6

对于全部数据，保证有 1 <= n <= 10^6 , 1 <= B <= 10^6
 * */
// 如果这个数是质数, 如果大于B,就不符合条件,直接跳过

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
    int n=30,b=3,ret=0;
    cin>>n>>b;
    if (b>=n){
        cout<<n;
        return 0;
    }
    int maxp[n+1]={0}; //保存最大质因子的数组
    bool isp[n+1]={0}; // 是否素数
    for (int i = 2; i <= n; ++i)
        isp[i]=1;
    for (int i = 1; i <= n ; ++i)
    {
        if(isp[i])
        {
            for (int j = i; j <= n; j+=i)
                isp[j]=0;
            for(int j=1;i*j<=n;j++)
            {
                // 因为i是素数, 所以i肯定是i*j这个数的质因子
                // 随着i的增长, 会将小的质因子替换掉,最后保存的就是最大质因子
                maxp[i*j]=i;
            }
        }
    }
    for (int i = 1; i <=n ; ++i)
    {
        if(maxp[i]<=b)
            ret++;
    }
    cout<<ret;
    return 0;
}